#include <iostream>
using namespace std;

/**
 * C++ 修饰符类型
 *
 * signed           :   有符号类型       （整形默认有符号）
 * unsigned         :   无符号           可以将变量范围扩大一倍
 * short            :
 * long             :
 * long long        :
 * float            :   单精度浮点数
 * double           :   双精度浮点数
 * bool             :   布尔类型
 * char             :   字符类型
 * wchar_t          :   宽字符            可以存储Unicode字符
 *
 *
 * C++中的类型限定符
 *
 * const            :   const 定义常亮，表示该变量的值不能被修改。
 * volatile         :   线程可见
 * restrict         :
 * mutable          :   mutable用于修饰的成员变量，被mutable修饰的成员变量可以被修改，即使他们所在对象是const的。
 * static           :
 * register         :   寄存器变量，可以被频繁使用，提高程序的运行效率。
 */
int main() {

    //定义有符号整形变量 num1,初始值为 -10
    signed int num1 = -10;
    //无符号整形变量
    unsigned int num2 = 20;
    //短整型变量
    short int num3 = 10;
    //长整型
    long int num4 = 100000;
    //单精度浮点数
    float numa = 3.14f;
    //双精度浮点数
    double numb = 2.71828;
    //布尔类型变量
    bool flag = true;
    //定义字符类型变量
    char ch1 = 'a';
    //宽字符
    wchar_t cha2 = L'你';


    //const实例
    const int NUM = 10;         //常量，不可以被修改
    const int* ptr = &NUM;      //定义指向常量的指针，指针所指的值不可修改
    int const* ptr2 = &NUM;     //和上面一行相同

    //volatile实例
    volatile int num = 20;      //定义变量num，其值可能在未知的时间被改变








    return 0;
}

//mutable实例
class MySip{
private:
    mutable int value_;
public:
    int get_value() const{
        return value_;
    }
    void set_value(int value) const{
        value_ = value;
    }
};

//static实例
void example_function(){
    static int count = 0;  //关键字使用变量count存储在程序生命周期内部存在
    count ++;
}

//register实例
void example_function2(register int num){
    //register 关键字建议编译器将变量num存储在寄存器中
    //可以提高程序执行速度
    //但是实际上是否会存储在寄存器中由编译器决定
}